package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 文件输入流
 * 用于从文件中读取字节数据
 * 继承自java.io.InputStream
 */
public class FISDemo {
    public static void main(String[] args) throws IOException {
        //将fos.dat中的数据读取回来
        /**
            int read()  注意返回的是int！！！！
            读取一个字节,将读取的8位2进制存入一个int值的低八位上,前面高24位补"0".
            然后将该int值返回.
            如果返回的是整数-1,则表示流读取到了末尾.
            int型整数-1的二进制,所有位都是1:"11111111 11111111 11111111 11111111"

            -----------------------------------------------------------
            第一次读取
            fos.dat文件内容:
            00000001 00000010
            ^^^^^^^^
            读取的字节
            int d = fis.read();
            d:00000000 00000000 00000000 00000001
              |---------补充24个0-------| 读取的字节

           ------------------------------------------
           第二次读取
           d = fis.read();
           fos.dat文件内容:
           00000001 00000010
                    ^^^^^^^^
                    读取的字节
          d:00000000 00000000 00000000 00000010
            |---------补充24个0-------| 读取的字节

          -----------------------------------------
          d = fis.read();
          fos.dat文件内容:
          00000001 00000010
                            ^^^^^^^^
                            文件末尾
          d:11111111 11111111 11111111 11111111
            int型整数-1的的2进制
          */
          /*-------------------------------------------------
                               二进制基本概念
         以1字节为例(1个byte)

          1byte是8位，二进制
          00000000:0
          00000001:1
          00000010:2
          00000011:3
          00000100:4
          ...
          11111111:255

          补码:有符号的表示数字,规则:最高位的2进制当作符号位
          0表示这是一个正数,1表示这是一个负数
          00000000:0
          00000001:1
          00000010:2
          ...
          01111111:127


          11111111:-1
          11111110:-2
          11111101:-3
          11111100:-4
          ...
          10000000:-128

          负数的计算:2进制取反+1

          11111101:-?
          ^
          1说明是负数

          计算负数:
          取反:
            11111101  每一位2进制都进行取反
            00000010
          再加1:
            00000011  整数3
          加个负号:
          11111101:-3


          为什么一个字节byte取值范围是-128-127
          第一位2进制当作了符号位,256个数字被分为了两部分,一半正数,一半负数

          byte最大值+1等于byte最小值
          01111111  127
          10000000  127+1  ->进位最终将符号位改成了负数:

          short:2字节
          00000000 00000000
          ^
         符号位
         short的-1:
         11111111 11111111


         int值:4字节
         00000000 00000000 00000000 00000000
         ^
         符号位
         int型最大值
         01111111 11111111 11111111 11111111
         int型-1
         11111111 11111111 11111111 11111111

         */ //二进制
        FileInputStream fis = new FileInputStream("./fos.dat");
        /**
         * 另一种构造器是：
         * FileInputStream(File file)
         */
        int d;
        d=fis.read();
        System.out.println(d);//1
        System.out.println(fis.read());//2
        System.out.println(fis.read());//-1
        System.out.println(fis.read());//-1//以后无论再调多少次，都是-1，因为已经到某位了
        fis.close();
    }
}
